package com.simon.cdc.sql;


import com.simon.cdc.event.ChangeEvent;

import java.util.StringJoiner;

/**
 * INSERT语句生成器
 */
final class InsertStatement {
    private static final String TEMPLATE = "INSERT INTO %s (%s) VALUES (%s)  ";

    private final ChangeEvent event;

    InsertStatement(ChangeEvent event) {
        this.event = event;
    }

    /**
     * 构建SQL插入语句的字符串表示形式
     * <p>
     * 此方法通过收集事件后的状态数据，生成一个用于插入数据库的SQL语句
     * 它将列名和对应的值格式化为SQL语句的组成部分，并使用指定的模板组合成完整的SQL语句
     *
     * @return 返回格式化后的SQL插入语句
     */
    String build() {
        // 创建StringJoiner对象以逗号分隔列名和对应的值
        StringJoiner columns = new StringJoiner(",");
        StringJoiner values = new StringJoiner(",");

        // 遍历事件后的状态Map，其中key为列名，value为对应的值
        event.getAfterState().forEach((key, value) -> {
            // 将列名添加到columns中
            columns.add(key);
            // 将值格式化为SQL格式，并添加到values中
            values.add(SQLValueFormatter.format(value));
        });

        // 使用TEMPLATE模板格式化SQL语句，插入表格名、列名和值
        return String.format(TEMPLATE,
                event.getTableName(),
                columns.toString(),
                values.toString());
    }
}